bitkeeper revision 1.501.1.1 (3f87b9c8EzBW2E02feJeTxpF8raA7Q)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Sat, 11 Oct 2003 08:05:28 +0000 (08:05 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Sat, 11 Oct 2003 08:05:28 +0000 (08:05 +0000)
xl_block.c, Makefile, CommandVbdList.java:
  Fix attach of vbds to an already running guest. Created xen_refresh_dev for this purpose.

tools/control/src/org/xenoserver/control/CommandVbdList.java
tools/misc/Makefile
xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.c

index 16fd1953c6359ab129c415575375a6fa5734cb86..c25191113a8b8dd7c36c293ec7bdbd44c14c545f 100644 (file)
@@ -35,7 +35,7 @@ public class CommandVbdList extends Command {
                     key = st.nextToken();
                 }
                 if (st.hasMoreTokens()) {
-                    if (Integer.parseInt(st.nextToken()) == 2) {
+                    if (Integer.parseInt(st.nextToken()) == 1) {
                         mode = Mode.READ_WRITE;
                     }
                 }
index 62e1ab7fee8daa69ed89c4e5736f9846c97792ee..9e74d5bd9398dcca4fc3a68e23eb4ade4ec753aa 100644 (file)
@@ -7,7 +7,7 @@ HDRS     = $(wildcard *.h)
 SRCS     = $(wildcard *.c)
 OBJS     = $(patsubst %.c,%.o,$(SRCS))
 
-TARGETS  = xen_read_console 
+TARGETS  = xen_read_console xen_refresh_dev
 
 INSTALL  = $(TARGETS) xen-mkdevnodes xen-clone
 
index 743ecd9be0b94d59184af3e4b9f2c6f454e4290f..12e3657d6ae7931b8136f1a6ca8f8026bf626b85 100644 (file)
@@ -272,11 +272,9 @@ int xenolinux_block_revalidate(kdev_t dev)
     struct gendisk *gd = xldev_to_gendisk(dev);
     xl_disk_t *disk = xldev_to_xldisk(dev);
     unsigned long flags;
-    int i, partn_shift = PARTN_SHIFT(dev);
-    int xdev = dev & XENDEV_IDX_MASK;
+    int i, partn_shift = PARTN_SHIFT(dev), disk_nr = MINOR(dev) >> partn_shift;
     
-    DPRINTK("xenolinux_block_revalidate: %d %d %d\n", 
-           dev, xdev, XENDEV_IDX_MASK);
+    DPRINTK("xenolinux_block_revalidate: %d\n", dev);
 
     spin_lock_irqsave(&io_request_lock, flags);
     if ( disk->usage > 1 )
@@ -286,14 +284,32 @@ int xenolinux_block_revalidate(kdev_t dev)
     }
     spin_unlock_irqrestore(&io_request_lock, flags);
 
-    for ( i = 0; i < (1 << partn_shift); i++ )
+    for ( i = (1 << partn_shift) - 1; i >= 0; i-- )
     {
-        invalidate_device(xdev + i, 1);
-        gd->part[xdev + i].start_sect = 0;
-        gd->part[xdev + i].nr_sects = 0;
+        invalidate_device(dev+i, 1);
+        gd->part[MINOR(dev+i)].start_sect = 0;
+        gd->part[MINOR(dev+i)].nr_sects = 0;
     }
 
-    grok_partitions(gd, MINOR(dev) >> partn_shift,
+    /* VBDs can change under our feet. Check if that has happened. */
+    if ( MAJOR(dev) == XLVIRT_MAJOR )
+    {
+        xen_disk_info_t *xdi = kmalloc(sizeof(*xdi), GFP_KERNEL);
+        if ( xdi != NULL )
+        {
+            memset(xdi, 0, sizeof(*xdi));
+            xenolinux_control_msg(XEN_BLOCK_PROBE_SEG, 
+                                  (char *)xdi, sizeof(*xdi));
+            for ( i = 0; i < xdi->count; i++ )
+                if ( IS_VIRTUAL_XENDEV(xdi->disks[i].device) &&
+                     ((xdi->disks[i].device & XENDEV_IDX_MASK) == disk_nr) )
+                    ((xl_disk_t *)gd->real_devices)[disk_nr].capacity =
+                        xdi->disks[i].capacity;
+            kfree(xdi);
+        }
+    }
+
+    grok_partitions(gd, disk_nr,
                     1 << partn_shift, disk->capacity);
 
     return 0;